import axios from 'axios'
import store from '@/store'
import { Toast } from 'antd-mobile'
import { customHistory } from './history'
import { clearToken, setToken } from './token'
const baseURL = 'http://toutiao.itheima.net/v1_0'

const http = axios.create({
  baseURL,
  timeout: 5000,
})
// 添加请求拦截器
http.interceptors.request.use(
  (config) => {
    // 在发送请求之前做些什么

    const {
      login: { token },
    } = store.getState()
    if (!config.url?.startsWith('/authorizations')) {
      config.headers!.Authorization = `Bearer ${token}`
    }

    return config
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
http.interceptors.response.use(
  (response) => {
    // 对响应数据做点什么
    return response
  },
  async (error) => {
    // 对响应错误做点什么

    if (!error.response) {
      Toast.show({
        duration: 1500,
        content: '网络繁忙, 请稍后再试',
      })
      return Promise.reject(error)
    }

    if (error.response.status === 401) {
      try {
        const { refresh_token } = store.getState().login
        if (!refresh_token) {
          // 第一种方式自己手动提醒
          // Toast.show({
          //   duration: 1000,
          //   content: '登陆超时, 请稍后再试',
          //   afterClose: () => {
          //     customHistory.push('/login', {
          //       from: customHistory.location.pathname,
          //     })
          //   },
          // })
          // return Promise.reject(error)

          // 第二种方式：
          // throw new Error(error)

          // 第三种方式: 正常try-catch无法捕获promise的错误信息，需要配合await 等待promise完成之后就可以捕获到错误信息了
          await Promise.reject(error)
        }

        const res = await axios.put(`${baseURL}/authorizations`, null, {
          headers: {
            Authorization: `Bearer ${refresh_token}`,
          },
        })

        const tokens = {
          token: res.data.data.token,
          refresh_token,
        }
        setToken(tokens)

        store.dispatch({ type: 'login/token', payload: tokens })

        return http(error.config)
      } catch (e) {
        store.dispatch({ type: 'login/logout' })
        clearToken()

        Toast.show({
          duration: 1000,
          content: '登陆超时, 请稍后再试',
          afterClose: () => {
            customHistory.push('/login', {
              from: customHistory.location.pathname,
            })
          },
        })
        return Promise.reject(error)
      }
    }
  }
)

export default http
